In diesem Skript wird die Nutzenergie pro Gebäude mit unterschiedlichen Methoden geschätzt. Zum einen wird eine Methode des AWEL verwendet. Zum anderen werden Berechnung von hinzugenommen.

Anmerkung: Die AWEL Methode wird im Moment auf alle SIA Gebäudetypen in gleicher Art und Weise angewendet. Dies müsste in Zukunft noch angepasst werden (grosse Lagerhallen haben weniger Energiebedarf, als kleine EFH -> Diesbezüglich haben wir eine Tabelle zur Schätzung des Wärmebedars von Romand Energie in welcher die 12 SIA Kategorien von S. 43, SIA 380 miteinbezogen werden. Die Werte beruhen auf Messungen.). Es ist mir nicht ganz klar, wie der Stromverbrauch von Romande Energie gemessen wurde und in welcher Einheit (für die meisten Gebäude wurde für die meisten Monate kein Verbrauch gemessen!?).

Daten einlesen

Die Daten aus dem vorhergehenden Arbeitsschritt werden eingelesen. Zusätzlich werden ein paar Werte pro Gebäude berechnet, welche für die spätere Visualisierung der SIA Klassifikation informativ sind.

load("output/02_output/geom/02_rolle_bld_out.Rdata")
crsInput<-proj4string(rolle_bld_out)

#wärmebedarf geschätzt von stefan
#für rolle
energyDem_rolle_ss<-read.csv(paste(dataPath,"03_SteSchGenf/HeatDemand_Rolle.csv",sep=""),sep="\t")
#und ms-rolle
energyDem_msrolle_ss<-as.data.frame(fread(paste(dataPath,"03_SteSchGenf/HeatDemand_MontSurRolle.csv",sep=""),sep="\t",quote=""))

#combine the rolle's
energyDem_ss<-rbind(energyDem_msrolle_ss,energyDem_rolle_ss)

#wärmebedarf geschätzt vom Kanton Waadt, resp. Romand Energie
energyDem_re<-readOGR(layer = "DensiteThermPct", dsn = paste(dataPath,"10_Rolle",sep=""))
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/tbderung/shares/ta/60 FuE/6096 SCCER/609635 FEEBD-II/60963505 Work Packages/JA RED/06-Daten/10_Rolle", layer: "DensiteThermPct"
## with 1123 features
## It has 43 fields
## Integer64 fields read as strings:  NUMERO_OFS CODE_EPOQU AFF_LOG AFF_ACT AE_CHAUF AE_ECS PROV_SRE_A PROV_SRE_L PROV_AFF_A PROV_AFF_L PROV_EPOQU PROV_AE_CH PROV_AE_EC PROV_RENOV NOTE_RECEN PROV_CONSO
energyDem_re<-spTransform(energyDem_re,CRSobj = crsInput)

#energieverbrauch von romand energie
#encoding ein bisschen tricky: erst in z.b. notepad++ öffnen und encoding auf UTF-8 konvertieren
energyVerb_re_rolle<-fread(paste(dataPath,"08_Elektrizitaet_RE/Consommation_Rolle.csv",sep=""),encoding="UTF-8",na.strings = "-")
energyVerb_re_msrolle<-fread(paste(dataPath,"08_Elektrizitaet_RE/Consommation_Mont_sur_Rolle.csv",sep=""),encoding="UTF-8",na.strings = "-")

energyVerb_re<-rbind(energyVerb_re_rolle,energyVerb_re_msrolle)
rm(list=c("energyVerb_re_rolle","energyVerb_re_msrolle"))

adresses<-fread(paste(dataPath,"11_Cadastre_AmtlVermessung/Adresses_9814_JYOEGH/Adresses/OIT_OIT_TPR_PT_ADRESSE.csv",sep=""),encoding="Latin-1",header = F)
adresses<-adresses[,c(1,4,8,12,13)]
names(adresses)<-c("id","nr","ad","long","lat")

Energiebedarf pro Gebäude

Wärmebedarf Methode 1: AWEL - Schätzen anhand von EBF und Alter

In diesem Schritt wird anhand der Energiebedarfsfläche (Gebäudefläche * Anzahl Stockwerke) und dem Gebäudealter der jährliche Energieverbrauch geschätzt. Die Schätzung beruht auf Daten aus dem Energieplanungsbereicht des Kantons Zürich aus dem Jahr 2013 (S.19, Abbildung 14). Das Szenario “thomas” beruht auf Annahmen welche im Energiekonzept der Gemeinde Wohlen gemacht wurden (S.19, Abbildung 12).

#function to compute energie use per year from the age and the total area of a building
#different scenarios can be selected
#the conversion of age/are into energy use is based on a study cited in the header
energyUse<-function(age,ebf,scenario="2011"){
  if(scenario=="2011"){
    age.c<-as.numeric(as.character(
      cut(x = age,
          breaks=c(1000,1919,1959,1979,1989,1999,2020),
          labels=c(137,173,170,127,95,87))))
  } else if(scenario=="1990"){
    age.c<-as.numeric(as.character(
      cut(x = age,
          breaks=c(1000,1919,1959,1979,1989,1999,2020),
          labels=c(187,217,223,170,100,90))))
  }else if(scenario=="2006"){
    age.c<-as.numeric(as.character(
      cut(x = age,
          breaks=c(1000,1919,1959,1979,1989,1999,2020),
          labels=c(142,177,180,140,100,90))))
  }else if(scenario=="minergie"){
    age.c<-as.numeric(as.character(
      cut(x = age,
          breaks=c(1000,2001,2020),
          labels=c(60,38))))
  }else if(scenario=="thomas"){
    age.c<-as.numeric(as.character(
      cut(x = age,
          breaks=c(1000,1919,1959,1979,1989,1994,1999,2004,2009,2020),
          labels=c(140,178,171,120,95,88,80,70,50))))
  }else{
    stop("<scenario> should be: 1990, 2006, 2011, minergie or thomas")
  }
  return(age.c*ebf)
}

age<-as.numeric(rolle_bld_out$GBAUJ)
ebf<-rolle_bld_out$ebf
rolle_bld_out$enerBed_awel<-energyUse(age,ebf,scenario = "thomas")

Wärmebedarf Methode 2: SS - Berechnungen von Stefan Schneider

Die Berechnungen von Stefan Schneider beruhen auf dieser Publikation.

energyDem_ss<-energyDem_ss[,c("GKODX",
                              "GKODY",
                              "EnPredCat_Ehww",
                              "Qh_cc_Est",
                              "Qww_Est",
                              "Ehww_Est",
                              "Ehww_Est_Net")]

coordinates(energyDem_ss)<-~GKODX+GKODY
proj4string(energyDem_ss)<-CRS("+init=epsg:21781")

ov<-over(rolle_bld_out,energyDem_ss)

rolle_bld_out@data<-cbind(rolle_bld_out@data,data.frame(enerBed_ss=ov$Ehww_Est))
rolle_bld_out$enerBed_ss<-rolle_bld_out$enerBed_ss/3.6*rolle_bld_out$ebf

Wärmebedarf Methode 3: RE - Schätzungen und Berechnungen des Kantons Waadt

Die Schätzungen beruhen auf Messungen von Romand Energie. Der Wärmebedarf wird anhand des Alters, der EBF und der SIA Gebäudeklasse geschätzt.

rolle_bld_out_pts <- gCentroid(rolle_bld_out,byid=TRUE)

ov<-over(rolle_bld_out_pts,energyDem_re[,c(22,25)])

rolle_bld_out$enerBed_vd<-ov$CONSO_TOT

Stromverbrauch von Romand Energie

Anmerkung: Ich verstehe die Daten von RE nicht wirklich. Es gibt beispielsweise zwei Messungen pro Gebäude. Welche soll benützt werden? Zudem haben die meisten Monate keinen Stromverbrauch!? Und welche Einheit haben die Messungen?

#reformatting the adresse data
adr<-strsplit(adresses$ad,split = "  ")
adr<-sapply(adr, function(x){
  if(length(x)>1){
    return(paste(x[[2]],x[[1]]))
  }else{
    return(x)
  }
  })

adr<-tolower(adr)
adr<-gsub("route","rte",adr)
adr<-gsub("chemin","ch.",adr)
adr<-gsub("avenue","av.",adr)
adr<-gsub("passage","pass.",adr)
adr<-gsub("promenade","prom.",adr)
adr<-gsub("route","rte",adr)
adr<-gsub("-"," ",adr)

adresses$adrFin<-paste(adr,adresses$nr)

#reformatting the energy database
energyVerb_re$adrFin<-tolower(energyVerb_re$`Rue PtConso`)
energyVerb_re$adrFin<-gsub("-"," ",energyVerb_re$adrFin)

#join adresses (and coordinates) to energy use
energyVerb_re<-left_join(energyVerb_re,adresses,by=c("adrFin","adrFin"))

#convert to spatial data
energyVerb_re<-energyVerb_re[!is.na(energyVerb_re$lat),]
ev_sp<-energyVerb_re
coordinates(ev_sp)<-~long+lat
proj4string(ev_sp)<-crsInput

#centroids of bld
bld_centr<-gCentroid(rolle_bld_out,byid = T)

#get a nearest bld for each adresse (since adresses are often not referenced inside bld)
ener_bld_dist<-spDists(ev_sp,bld_centr)
colnames(ener_bld_dist)<-rolle_bld_out$EGID

ener_min_bld<-apply(ener_bld_dist,1,which.min)
ener_min_bld<-rolle_bld_out$EGID[ener_min_bld]
ener_min_dist<-apply(ener_bld_dist,1,min)

#get an EGID for each bld
energyVerb_re$EGID<-ener_min_bld

#only use adresses that are not further than 30m from the nearest bld
energyVerb_re<-energyVerb_re[ener_min_dist<30,]

#compute to sum for two years of monthly electricity measures (and devide by 2)
energyVerb_re$enerVer_re<-rowSums(energyVerb_re[,14:37],na.rm=T)/2

#aggregate the energy use per bld
energyVerb_re_agg <- energyVerb_re%>%
  dplyr::group_by(EGID)%>%
  dplyr::summarise(enerVer_re=sum(enerVer_re,na.rm=T))

#link energy use to the bld of rolle
rolle_bld_out@data<-left_join(rolle_bld_out@data,energyVerb_re_agg, by="EGID")

Visualisierung

rolle_bld_out.wgs<-spTransform(rolle_bld_out,CRSobj = CRS("+init=epsg:4326"))

qpal_verb <- colorBin(
  palette = "YlGnBu",
  domain = rolle_bld_out.wgs$enerVer_re,
  bins=quantile(round(rolle_bld_out.wgs$enerVer_re),na.rm=T,seq(0,1,length.out = 8))
)

qpal_bed <- colorBin(
  palette = "YlGnBu",
  domain = c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd),
  bins=quantile(c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd),na.rm=T,seq(0,1,length.out = 5))
)

rolle_bld_out.wgs$DemDiff<-rolle_bld_out.wgs$enerBed_awel-rolle_bld_out.wgs$enerBed_ss

rolle_bld_out.wgs.und<-rolle_bld_out.wgs[rolle_bld_out.wgs$DemDiff<0 & !is.na(rolle_bld_out.wgs$DemDiff),]
qpal_under <- colorBin(
  palette = "YlGnBu",
  reverse = T,
  domain = rolle_bld_out.wgs.und$DemDiff,
  bins=quantile(rolle_bld_out.wgs.und$DemDiff,na.rm=T,seq(0,1,length.out = 5))
)

rolle_bld_out.wgs.ov<-rolle_bld_out.wgs[rolle_bld_out.wgs$DemDiff>=0 & !is.na(rolle_bld_out.wgs$DemDiff),]
qpal_over<- colorBin(
  palette = "YlOrRd",
  domain = rolle_bld_out.wgs.ov$DemDiff,
  bins=quantile(rolle_bld_out.wgs.ov$DemDiff,na.rm=T,seq(0,1,length.out = 5))
)

#visualisierung mit leaflet
m <- leaflet() %>%

  addProviderTiles(providers$OpenStreetMap, group = "normal") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "OSM (b/w)") %>%
  addProviderTiles("Esri.WorldImagery", group = "ESRI") %>%

  addPolygons(data=rolle_bld_out.wgs,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_bed(rolle_bld_out.wgs$enerBed_awel),
              weight=1,
              popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_awel)),
              group = "Energiebedarf (AWEL)")%>%

  addPolygons(data=rolle_bld_out.wgs,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_bed(rolle_bld_out.wgs$enerBed_ss),
              weight=1,
              popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_ss)),
              group = "Energiebedarf (S.Schneid.)")%>%
  
    addPolygons(data=rolle_bld_out.wgs,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_bed(rolle_bld_out.wgs$enerBed_vd),
              weight=1,
              popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_vd)),
              group = "Energiebedarf (VD / RE)")%>%

  addPolygons(data=rolle_bld_out.wgs.ov,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_over(rolle_bld_out.wgs.ov$DemDiff),
              weight=1,
              popup = as.character(rolle_bld_out.wgs.ov$DemDiff),
              group = "Energiebedarf (AWEL > SS)")%>%

    addPolygons(data=rolle_bld_out.wgs.und,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_under(rolle_bld_out.wgs.und$DemDiff),
              weight=1,
              popup = as.character(rolle_bld_out.wgs.und$DemDiff),
              group = "Energiebedarf (AWEL < SS)")%>%
  
      addPolygons(data=rolle_bld_out.wgs,
              stroke = TRUE,
              fillOpacity = 0.8,
              color = ~qpal_verb(rolle_bld_out.wgs$enerVer_re),
              weight=1,
              popup = paste("Bedarf (AWEL):",rolle_bld_out.wgs$enerBed_awel,"/ Verbrauch (RE):",rolle_bld_out.wgs$enerVer_re),
              group = "Energieverbrauch (RE)")%>%
  
  addLayersControl(
    baseGroups = c("OSM (b/w)","normal", "ESRI"),
    overlayGroups = c("Energiebedarf (AWEL)","Energiebedarf (S.Schneid.)","Energiebedarf (VD / RE)","Energiebedarf (AWEL > SS)","Energiebedarf (AWEL < SS)","Energieverbrauch (RE)"),
    options = layersControlOptions(collapsed = F)
  )%>%
  addLegend(pal = qpal_bed, 
            values =c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd), 
            opacity = 1,
            title = "Energiebedarf: kWh/a",
            position = "bottomleft"
            )%>%
  addLegend(pal = qpal_over,
            values =rolle_bld_out.wgs.ov$DemDiff,
            opacity = 1,
            title = "WBL > SS: log10(kWh/a)",
            position = "bottomleft"
            )%>%
  addLegend(pal = qpal_verb, 
            values =rolle_bld_out.wgs$enerVer_re, 
            opacity = 1,
            title = "Energieverbrauch (RE): ?",
            position = "bottomleft"
            )%>%
  addLegend(pal = qpal_under,
            values =rolle_bld_out.wgs.und$DemDiff,
            opacity = 1,
            title = "WBL < SS: log10(kWh/a)",
            position = "bottomleft"
            )%>%
  hideGroup(c("Energiebedarf (S.Schneid.)","Energiebedarf (VD / RE)","Energiebedarf (AWEL > SS)","Energiebedarf (AWEL < SS)","Energieverbrauch (RE)"))
## Warning in qpal_verb(rolle_bld_out.wgs$enerVer_re): Some values were
## outside the color scale and will be treated as NA

## Warning in qpal_verb(rolle_bld_out.wgs$enerVer_re): Some values were
## outside the color scale and will be treated as NA
#leaflet karte ausführen
m

Save all Information

#html karte speichern
wd<-getwd()
htmlwidgets::saveWidget(m, file=paste(wd,"/output/03_output/map/mapEnergy.html",sep=""),selfcontained = T)

#buildings speichern
save(rolle_bld_out,file="output/03_output/geom/03_rolle_bld_out.Rdata")